package presentacion;
import java.awt.EventQueue;

import javax.swing.JInternalFrame;

import java.awt.BorderLayout;

import javax.swing.JLabel;
import javax.swing.JTextField;

import java.awt.Font;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;

import static biblioteca.FuncionesDeVentanas.*;

import javax.swing.JComboBox;
import javax.swing.JPanel;

import java.awt.Dimension;
import java.sql.*;
import java.text.ParseException;
import java.util.Vector;

import javax.swing.DefaultCellEditor;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.MaskFormatter;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;

import java.awt.Color;

import javax.swing.UIManager;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.border.BevelBorder;

import static biblioteca.FuncionesUtilitarias.*;
import logicaDeNegocios.Cliente;
import logicaDeNegocios.Fecha;
import logicaDeNegocios.Telefono;

public class RegistroDeCliente extends JInternalFrame {
	
	private static final long serialVersionUID = 1L;
	private JTextField textFieldCodigoCliente;
	private JTextField textFieldNombreCliente;
	private JTextField textFieldDireccionCliente;
	private JTextField textFieldEmailCliente;
	private JTextField textFieldPasaporteCliente;
	private JTable tablaTelefonos;
	private JFormattedTextField formattedTextFieldCedulaCliente;
	private JFormattedTextField formattedTextFieldFechaCliente;
	
	private JButton btnNuevoCliente;
	private JButton btnGuardarCliente;
	private JButton btnRetornarCliente;
	private JButton btnBuscarCliente;
	public JButton btnModificarCliente;
	public JButton btnCancelarCliente;
	
	private boolean seEstaModificando = false;
	private JPanel panelPrincipal;
	private Fecha fecha;
	private DefaultTableModel modeloTabla;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try
				{
					RegistroDeCliente frame = new RegistroDeCliente();
					frame.setVisible(true);
				} 
				catch (Exception e) 
				{
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 * @throws ParseException 
	 */
	public RegistroDeCliente() throws ParseException {
		setTitle("Registrar Cliente");
				
		setBounds(100, 100, 457, 421);
		
		quitarBotonesDelSistemaJInternalFrame(this);
		quitarBotonEsquinaIzquierdaJInternalFrame(this);
		getContentPane().setLayout(new BorderLayout(0, 0));
		
		panelPrincipal = new JPanel();
		panelPrincipal.setLayout(null);
		getContentPane().add(panelPrincipal,BorderLayout.CENTER);
		
		JLabel labelCodigoCliente = new JLabel("Codigo:");
		labelCodigoCliente.setBounds(32, 13, 54, 14);
		panelPrincipal.add(labelCodigoCliente);
		
		textFieldCodigoCliente = new JTextField();
		textFieldCodigoCliente.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		textFieldCodigoCliente.setEditable(false);
		textFieldCodigoCliente.setFont(new Font("SansSerif", Font.PLAIN, 11));
		textFieldCodigoCliente.setColumns(10);
		textFieldCodigoCliente.setBounds(98, 13, 100, 25);
		panelPrincipal.add(textFieldCodigoCliente);
		
		JLabel labelNombreCliente = new JLabel("Nombre:");
		labelNombreCliente.setBounds(32, 45, 56, 14);
		panelPrincipal.add(labelNombreCliente);
		
		textFieldNombreCliente = new JTextField();
		textFieldNombreCliente.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		textFieldNombreCliente.setFont(new Font("SansSerif", Font.PLAIN, 11));
		textFieldNombreCliente.setColumns(50);
		textFieldNombreCliente.setBounds(98, 45, 286, 25);
		panelPrincipal.add(textFieldNombreCliente);
		
		JLabel labelDireccionCliente = new JLabel("Direcci\u00F3n:");
		labelDireccionCliente.setBounds(32, 75, 65, 14);
		panelPrincipal.add(labelDireccionCliente);
		
		textFieldDireccionCliente = new JTextField();
		textFieldDireccionCliente.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		textFieldDireccionCliente.setFont(new Font("SansSerif", Font.PLAIN, 11));
		textFieldDireccionCliente.setColumns(60);
		textFieldDireccionCliente.setBounds(98, 75, 286, 25);
		panelPrincipal.add(textFieldDireccionCliente);
		
		JLabel labelEmailCliente = new JLabel("Email:");
		labelEmailCliente.setBounds(32, 104, 56, 14);
		panelPrincipal.add(labelEmailCliente);
		
		textFieldEmailCliente = new JTextField();
		textFieldEmailCliente.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		textFieldEmailCliente.setFont(new Font("SansSerif", Font.PLAIN, 11));
		textFieldEmailCliente.setColumns(60);
		textFieldEmailCliente.setBounds(98, 104, 286, 25);
		panelPrincipal.add(textFieldEmailCliente);
		
		JLabel labelCedulaCliente = new JLabel("Cedula:");
		labelCedulaCliente.setBounds(32, 134, 58, 14);
		panelPrincipal.add(labelCedulaCliente);
		
		formattedTextFieldCedulaCliente = new JFormattedTextField(new MaskFormatter("###-#######-#"));
		formattedTextFieldCedulaCliente.setFocusLostBehavior(JFormattedTextField.PERSIST);
		formattedTextFieldCedulaCliente.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		formattedTextFieldCedulaCliente.setFont(new Font("SansSerif", Font.PLAIN, 11));
		formattedTextFieldCedulaCliente.setColumns(13);
		formattedTextFieldCedulaCliente.setBounds(98, 134, 100, 25);
		panelPrincipal.add(formattedTextFieldCedulaCliente);
			
		JLabel labelFechaCliente = new JLabel("Fecha :");
		labelFechaCliente.setBounds(226, 134, 46, 14);
		panelPrincipal.add(labelFechaCliente);
		
		fecha = new Fecha();
		
		formattedTextFieldFechaCliente = new JFormattedTextField(fecha.obtenerFechaUsuario());
		formattedTextFieldFechaCliente.setFocusLostBehavior(JFormattedTextField.REVERT);
		formattedTextFieldFechaCliente.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		formattedTextFieldFechaCliente.setFont(new Font("SansSerif", Font.PLAIN, 11));
		formattedTextFieldFechaCliente.setEditable(false);
		formattedTextFieldFechaCliente.setColumns(10);
		formattedTextFieldFechaCliente.setBounds(284, 134, 100, 25);
		panelPrincipal.add(formattedTextFieldFechaCliente);
		
		btnBuscarCliente = new JButton("Buscar");
		btnBuscarCliente.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				BusquedaDeCliente buscarCliente = new BusquedaDeCliente(RegistroDeCliente.this);
				VentanaPrincipal.desktopPane.add(buscarCliente);
				buscarCliente.toFront();
				buscarCliente.setVisible(true);
			}
		});
		btnBuscarCliente.setBounds(210, 10, 97, 30);
		panelPrincipal.add(btnBuscarCliente);
		
		JPanel panelTelefonoCliente = new JPanel();
		panelTelefonoCliente.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Telefonos ", TitledBorder.LEADING, TitledBorder.TOP, null, Color.BLACK));
		panelTelefonoCliente.setBounds(6, 196, 433, 152);
		panelPrincipal.add(panelTelefonoCliente);
		panelTelefonoCliente.setLayout(null);
		
		JScrollPane panelDeslizante = new JScrollPane();
		panelDeslizante.setBounds(14, 18, 405, 120);
		panelTelefonoCliente.add(panelDeslizante);
		
		String[] encabezados = new String[] {"Tipo", "Numero"};			
		modeloTabla = new DefaultTableModel();
		modeloTabla.setColumnCount(2);
		modeloTabla.setRowCount(5);
		modeloTabla.setColumnIdentifiers(encabezados);
				
		tablaTelefonos = new JTable(modeloTabla);
		tablaTelefonos.setModel(modeloTabla);
		tablaTelefonos.setRowHeight(24);
		
		JComboBox<String> comboTelefonos = new JComboBox<String>();
		comboTelefonos.addItem(null);
		comboTelefonos.addItem("Casa");
		comboTelefonos.addItem("Celular");
		comboTelefonos.addItem("Trabajo");
		comboTelefonos.addItem("Otro");
		
		tablaTelefonos.setFillsViewportHeight(true);
		
		tablaTelefonos.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(comboTelefonos));
		DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
		renderer.setToolTipText("Haga click para seleccionar.");
		tablaTelefonos.getColumnModel().getColumn(0).setCellRenderer(renderer);
		tablaTelefonos.getTableHeader().setReorderingAllowed(false);
		
		JFormattedTextField telefono = new JFormattedTextField(new MaskFormatter("(###) ###-####"));
		tablaTelefonos.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(telefono));
		tablaTelefonos.getColumnModel().getColumn(1).setCellRenderer(renderer);
		
		panelDeslizante.setViewportView(tablaTelefonos);
		
		panelTelefonoCliente.add(panelDeslizante);
		
		JPanel panelBotonesCliente = new JPanel();
		panelBotonesCliente.setLocation(0, 347);
		panelPrincipal.add(panelBotonesCliente);
		panelBotonesCliente.setSize(new Dimension(445, 47));
		panelBotonesCliente.setLayout(null);
		panelBotonesCliente.setSize(445,47);
		
		btnNuevoCliente = new JButton("Nuevo");
		btnNuevoCliente.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				limpiarCampos(panelPrincipal);
				limpiarTabla(tablaTelefonos);
				fecha = new Fecha();
				formattedTextFieldFechaCliente.setText(fecha.obtenerFechaUsuario());
				habilitarCampos();
				btnGuardarCliente.setEnabled(true);
				btnCancelarCliente.setEnabled(true);						
			}
		});
		btnNuevoCliente.setBounds(-1, 2, 85, 40);
		panelBotonesCliente.add(btnNuevoCliente);
		btnGuardarCliente = new JButton("Guardar");
		btnGuardarCliente.setEnabled(false);
		btnGuardarCliente.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{	
				bloquearCampos();
				if (seEstaModificando)
				{
					try 
					{
						modificarDatos();
					} 
					catch (ClassNotFoundException | SQLException e1) 
					{
						e1.printStackTrace();
					}
				}
				else
				{
					guardarDatos();
				}
			}
		});
		btnGuardarCliente.setBounds(90, 2, 85, 40);
		panelBotonesCliente.add(btnGuardarCliente);
		
		btnModificarCliente = new JButton("Modificar");
		btnModificarCliente.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				seEstaModificando = true;
				btnGuardarCliente.setEnabled(true);
				btnModificarCliente.setEnabled(false);
				habilitarCampos();
			}
		});
		btnModificarCliente.setEnabled(false);
		btnModificarCliente.setBounds(180, 2, 85, 40);
		panelBotonesCliente.add(btnModificarCliente);
		
		btnCancelarCliente = new JButton("Cancelar");
		btnCancelarCliente.setEnabled(false);
		btnCancelarCliente.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				limpiarCampos(panelPrincipal);
				limpiarTabla(tablaTelefonos);
				bloquearCampos();
				btnNuevoCliente.setEnabled(true);
				btnBuscarCliente.setEnabled(true);
				
				if (seEstaModificando) 
				{
					btnModificarCliente.setEnabled(false);
					seEstaModificando = false;
				}
				
				btnGuardarCliente.setEnabled(false);
				btnModificarCliente.setEnabled(false);
				btnCancelarCliente.setEnabled(false);
			}
		});
		btnCancelarCliente.setBounds(270, 2, 85, 40);
		panelBotonesCliente.add(btnCancelarCliente);
		
		btnRetornarCliente = new JButton("Retornar");
		btnRetornarCliente.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				dispose();
			}
		});
		btnRetornarCliente.setBounds(361, 2, 85, 40);
		panelBotonesCliente.add(btnRetornarCliente);
		
		JLabel lblPasaporte = new JLabel("Pasaporte:");
		lblPasaporte.setBounds(32, 165, 65, 14);
		panelPrincipal.add(lblPasaporte);
		
		textFieldPasaporteCliente = new JTextField();
		textFieldPasaporteCliente.setFont(new Font("SansSerif", Font.PLAIN, 11));
		textFieldPasaporteCliente.setEnabled(false);
		textFieldPasaporteCliente.setColumns(60);
		textFieldPasaporteCliente.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		textFieldPasaporteCliente.setBounds(98, 165, 160, 25);
		panelPrincipal.add(textFieldPasaporteCliente);
		
		bloquearCampos();
	}
	
	// TODO: Resolver cedula 000-0000000-0

    //Funcion para guardar los datos en la base de datos	
	public void guardarDatos()
	{
		if (hayCamposVacios())
		{
			JOptionPane.showMessageDialog(null,"No pueden existir campos vacios.\n Favor completar registo");
		}
		
		String cedula = quitarPatron(formattedTextFieldCedulaCliente.getText(), "-");
		if ( !esCedulaValida(cedula) )
		{
			formattedTextFieldCedulaCliente.requestFocusInWindow();
			
			return;
		}
		
		else 
		{
			try 
			{
				String nombreCliente    = textFieldNombreCliente.getText();
				String direccionCliente = textFieldDireccionCliente.getText();
				String emailCliente     = textFieldEmailCliente.getText();
				String cedulaCliente    = formattedTextFieldCedulaCliente.getText();
				String pasaporteCliente = textFieldPasaporteCliente.getText();
				String fechaCliente     = fecha.obtenerFechaMySQL();
							
				int idInsertado = -1;
				Cliente elCliente = new Cliente(null,nombreCliente, direccionCliente, emailCliente, cedulaCliente, 
												pasaporteCliente, fechaCliente, obtenerTelefonos());
				idInsertado = elCliente.guardar();
				
				btnBuscarCliente.setEnabled(true);
				btnCancelarCliente.setEnabled(false);
				btnNuevoCliente.setEnabled(true);
				btnGuardarCliente.setEnabled(false);
				limpiarCampos(panelPrincipal);
				limpiarTabla(tablaTelefonos);
				bloquearCampos();
				btnBuscarCliente.setEnabled(true);
	
				if (idInsertado <= 0)
				{
					JOptionPane.showMessageDialog(null,"No se pudo guardar el registro.");
				}
			} 
			catch (ClassNotFoundException | SQLException e) 
			{
				e.printStackTrace();
			}
		}
	}

	//verifica si hay campos vacios
	private boolean hayCamposVacios() 
	{
		return textFieldNombreCliente.getText().equals("") || textFieldDireccionCliente.getText().equals("") || 
				textFieldEmailCliente.getText().equals("") || textFieldPasaporteCliente.getText().equals("") || 
				formattedTextFieldCedulaCliente.getText().equals("");
	}
	
	//modifica los datos en la tabla
	public void modificarDatos() throws ClassNotFoundException, SQLException 
	{
		String idCliente        = textFieldCodigoCliente.getText();
		String nombreCliente    = textFieldNombreCliente.getText();
		String direccionCliente = textFieldDireccionCliente.getText();
		String emailCliente     = textFieldEmailCliente.getText();
		String cedulaCliente    = formattedTextFieldCedulaCliente.getText();
		String pasaporteCliente = textFieldPasaporteCliente.getText();
		String fechaCliente     = fecha.obtenerFechaMySQL();
		
		//TODO: tomar los valores que aparezcan en la tabla de telefonos e insertarlos en la base de datos.

		Cliente elCliente = new Cliente(idCliente, nombreCliente, direccionCliente, emailCliente, cedulaCliente, 
										pasaporteCliente, fechaCliente, obtenerTelefonos());
		elCliente.actualizar();
		
		if (hayCamposVacios())
		{
			JOptionPane.showMessageDialog(null,"No pueden existir campos vacios.\n Favor completar registro");					
		}
		else 
		{
			seEstaModificando = false;
			
			btnBuscarCliente.setEnabled(true);
			btnCancelarCliente.setEnabled(false);
			btnNuevoCliente.setEnabled(true);
			btnGuardarCliente.setEnabled(false);
			
			limpiarCampos(panelPrincipal);
			limpiarTabla(tablaTelefonos);
			bloquearCampos();
		}
	}
	//funcion para obtener los telefonos que seran guardados
	public Vector<Telefono> obtenerTelefonos() 
	{
		if (tablaTelefonos.getCellEditor() != null)
		{
			tablaTelefonos.getCellEditor().stopCellEditing();
		}
				
		Vector<Telefono> telefonos = new Vector<Telefono>();
		int filas = tablaTelefonos.getRowCount();
		for (int i = 0; i < filas; i++) 
		{									
			String tipo = (String)(tablaTelefonos.getModel().getValueAt(i, 0));
			String numero = (String)(tablaTelefonos.getModel().getValueAt(i, 1));
			
			if (tipo != null && numero != null)
			{
				telefonos.add(new Telefono(tipo, numero));
			}
		}
		
		
		for (int i = 0; i < telefonos.size(); i++) 
		{
			System.out.println(telefonos.get(i));	
		}
		return telefonos;
	}

    //carga los datos de la busqueda para ser modificados
	public void cargarDatosBusqueda(Cliente cliente) 
	{	
		textFieldCodigoCliente.setText(cliente.obtenerId());
		textFieldNombreCliente.setText(cliente.obtenerNombre());
		textFieldDireccionCliente.setText(cliente.obtenerDireccion());
		textFieldEmailCliente.setText(cliente.obtenerEmail());
		formattedTextFieldCedulaCliente.setText(cliente.obtenerCedula());
		textFieldPasaporteCliente.setText(cliente.obtenerPasaporte());
		fecha = new Fecha(cliente.obtenerFecha());
		formattedTextFieldFechaCliente.setText(fecha.obtenerFechaUsuario());		
	}

    //bloquea los campos dada algunas condiciones	
	public void bloquearCampos()
	{
		textFieldNombreCliente.setEnabled(false);
		textFieldDireccionCliente.setEnabled(false);
		textFieldEmailCliente.setEnabled(false);
		formattedTextFieldCedulaCliente.setEnabled(false);
		formattedTextFieldFechaCliente.setEnabled(false);
		textFieldPasaporteCliente.setEnabled(false);
		tablaTelefonos.setEnabled(false);
	}

    //habilita los campos dada algunas condiciones	
	public void habilitarCampos()
	{
		textFieldNombreCliente.setEnabled(true);
		textFieldDireccionCliente.setEnabled(true);
		textFieldEmailCliente.setEnabled(true);
		formattedTextFieldCedulaCliente.setEnabled(true);
		formattedTextFieldFechaCliente.setEnabled(true);
		textFieldPasaporteCliente.setEnabled(true);
		tablaTelefonos.setEnabled(true);
		
		btnBuscarCliente.setEnabled(false);
		btnNuevoCliente.setEnabled(false);
	}
	
	public void botonesEvento()
	{
		btnCancelarCliente.setEnabled(true);
		btnModificarCliente.setEnabled(true);
	}
}